www.gusucode.com > VC++ 密码探测器 > VC++ 密码探测器/gusucode/PwdSpy/PopupTipWnd.cpp
// PopupTipWnd.cpp : implementation file // #include "stdafx.h" #include "PwdSpy.h" #include "PopupTipWnd.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // Register control during class initialization bool CPopupTipWnd::s_bRegistered = CPopupTipWnd::RegisterWindowClass(); ///////////////////////////////////////////////////////////////////////////// // CPopupTipWnd CPopupTipWnd::CPopupTipWnd() { m_pParentWnd = NULL; } CPopupTipWnd::~CPopupTipWnd() { } BEGIN_MESSAGE_MAP(CPopupTipWnd, CWnd) //{{AFX_MSG_MAP(CPopupTipWnd) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPopupTipWnd message handlers //*********************************************** BOOL CPopupTipWnd::Create(CWnd *pParentWnd) { _ASSERTE(pParentWnd); m_pParentWnd = pParentWnd; DWORD dwStyle = WS_BORDER | WS_POPUP; DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST; BOOL bCreated = CreateEx(dwExStyle, PWDSPY_POPUP_TIP_CLASSNAME, NULL, dwStyle, 0, 0, 0, 0, NULL, NULL, NULL); return bCreated; } //*********************************************** bool CPopupTipWnd::RegisterWindowClass(void) { WNDCLASS wndcls = {0}; wndcls.style = CS_SAVEBITS | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; wndcls.lpfnWndProc = ::DefWindowProc; wndcls.hCursor = (HCURSOR)::LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE); wndcls.hbrBackground = (HBRUSH)(COLOR_INFOBK + 1); wndcls.lpszClassName = PWDSPY_POPUP_TIP_CLASSNAME; if(!::RegisterClass(&wndcls)) { AfxThrowResourceException(); return false; } return true; } //*********************************************** void CPopupTipWnd::ShowPopupWindow(CString strText, CPoint point, CRect rect) { // If there is no password, instead hide the window and be done with it if(strText.IsEmpty()) { HidePopupWindow(); return; } CClientDC dc(this); // Use same font as parent window CFont *pOldFont = dc.SelectObject(m_pParentWnd->GetFont()); // Calculate the window size. CSize sizeText = dc.GetTextExtent(strText); CSize sizeWindow; sizeWindow.cx = sizeText.cx + 2 * BORDER_X; sizeWindow.cy = sizeText.cy + 2 * BORDER_Y; // Draw information in window dc.SetBkMode(TRANSPARENT); dc.DrawText(strText, CRect(0, 0, sizeWindow.cx, sizeWindow.cy), DT_CENTER | DT_VCENTER | DT_SINGLELINE); dc.SelectObject(pOldFont); // Calculate window rectangle position on screen CRect rectWindow; rectWindow.left = rect.left; rectWindow.right = rectWindow.left + sizeWindow.cx; rectWindow.top = rect.top - (sizeWindow.cy + 20); if(rectWindow.top <= 0) rectWindow.top = rect.bottom + 20; rectWindow.bottom = rectWindow.top + sizeWindow.cy; // Display window SetWindowPos(&wndTop, rectWindow.left, rectWindow.top, rectWindow.Width(), rectWindow.Height(), SWP_SHOWWINDOW | SWP_NOACTIVATE); } //*********************************************** void CPopupTipWnd::HidePopupWindow(void) { ShowWindow(SW_HIDE); }